﻿using System;
using System.ComponentModel;
using System.Runtime.Serialization;

namespace RiskMan.DataClass.Models.NotBasModels
{
    [Serializable]
    public class SettingOrderOpenClosePoz : INotifyPropertyChanged, ISerializable
    {

        #region Private
        //заявка на открытие позиции
        private string _TypeOrderOpen;
        private double _OtstupForOpenOrder;
        private string _KillOrderOpen;
        private int _TimeWiatOpenPoz;
        private double _SpredForKillOrderOpen;

        private string _TypePricing;
        private string _TypeStop;
        private double _Profit;
        private double _StopLimitOtstup;
        private double _StopLimitSpred;

        private DateTime _timeKillStopOrder;
        #endregion


        #region Public


        #region Открытие позиции
        /// <summary>
        /// Тип заявки на откыртие позиции
        /// </summary>
        public string TypeOrderOpen
        {
            get { return _TypeOrderOpen; }
            set
            {
                if (_TypeOrderOpen != value)
                {
                    _TypeOrderOpen = value;
                    RaisePropertyChanged("TypeOrderOpen");
                }
            }
        }

        /// <summary>
        /// Отступ от цены сигнала: уровень+спред - для лонг, уровнеь-спред - для шорт. Для лимитной заявки
        /// </summary>
        public double OtstupForOpenOrder
        {
            get { return _OtstupForOpenOrder; }
            set
            {
                if (_OtstupForOpenOrder != value)
                {
                    _OtstupForOpenOrder = value;
                    RaisePropertyChanged("OtstupForOpenOrder");
                }
            }
        }

        /// <summary>
        /// Снятие зявки на отркытие позиции, по условиям
        /// </summary>
        public string KillOrderOpen
        {
            get { return _KillOrderOpen; }
            set
            {
                if (_KillOrderOpen != value)
                {
                    _KillOrderOpen = value;
                    RaisePropertyChanged("KillOrderOpen");
                }
            }
        }

        /// <summary>
        /// Время, за которое должна исполнится заявка на открытие или будет снята, сек
        /// </summary>
        public int TimeWiatOpenPoz
        {
            get { return _TimeWiatOpenPoz; }
            set
            {
                if (_TimeWiatOpenPoz != value)
                {
                    _TimeWiatOpenPoz = value;
                    RaisePropertyChanged("TimeWiatOpenPoz");
                }
            }
        }


        /// <summary>
        /// Если цена отклоняется от цены исполения сделки на заданную величину, то заявка на октрытие будет снята, при условии, что не было частичного исполения заявки
        /// </summary>
        public double SpredForKillOrderOpen
        {
            get { return _SpredForKillOrderOpen; }
            set
            {
                if (_SpredForKillOrderOpen != value)
                {
                    _SpredForKillOrderOpen = value;
                    RaisePropertyChanged("SpredForKillOrderOpen");
                }
            }
        } 
        #endregion


        /// <summary>
        /// Тип расчета цен для стоп-заявок и заявок на закрытие позиции
        /// </summary>
        public string TypePricing
        {
            get { return _TypePricing; }
            set
            {
                if (_TypePricing != value)
                {
                    _TypePricing = value;
                    RaisePropertyChanged("TypePricing");
                }
            }
        }

        /// <summary>
        /// Тип выставляемой заявки на закрытие позиции
        /// </summary>
        public string TypeStop
        {
            get { return _TypeStop; }
            set
            {
                if (_TypeStop != value)
                {
                    _TypeStop = value;
                    RaisePropertyChanged("TypeStop");
                }
            }
        }

        /// <summary>
        /// Прибыль, на величину которой выставляется заявка на закрытие позиции
        /// </summary>
        public double Profit
        {
            get { return _Profit; }
            set
            {
                if (_Profit != value)
                {
                    _Profit = value;
                    RaisePropertyChanged("Profit");
                }
            }
        }

        /// <summary>
        /// стоп-лосс, выход из позиции
        /// </summary>
        public double StopLimitOtstup
        {
            get { return _StopLimitOtstup; }
            set
            {
                if (_StopLimitOtstup != value)
                {
                    _StopLimitOtstup = value;
                    RaisePropertyChanged("StopLimitOtstup");
                }
            }
        }

        /// <summary>
        /// спред для стоп-заявки
        /// </summary>
        public double StopLimitSpred
        {
            get { return _StopLimitSpred; }
            set
            {
                if (_StopLimitSpred != value)
                {
                    _StopLimitSpred = value;
                    RaisePropertyChanged("StopLimitSpred");
                }
            }
        }

        /// <summary>
        /// Время сняти стопа
        /// </summary>
        public DateTime TimeKillStopOrder
        {
            get { return _timeKillStopOrder; }
            set
            {
                if (_timeKillStopOrder != value)
                {
                    _timeKillStopOrder = value;
                    RaisePropertyChanged("TimeKillStopOrder");
                }
            }
        }

        #endregion


        public SettingOrderOpenClosePoz() { }

        #region event PropertyChangedEventHandler

        public event PropertyChangedEventHandler PropertyChanged;

        protected void RaisePropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #endregion

        public SettingOrderOpenClosePoz(SerializationInfo info, StreamingContext context)
        {

            TypePricing = info.GetString("TypePricing");
            TypeStop = info.GetString("TypeStop");
            Profit = info.GetDouble("Profit");
            StopLimitOtstup = info.GetDouble("StopLimitOtstup");
            StopLimitSpred = info.GetDouble("StopLimitSpred");

            TypeOrderOpen = info.GetString("TypeOrderOpen");
            OtstupForOpenOrder = info.GetDouble("OtstupForOpenOrder");
            KillOrderOpen = info.GetString("KillOrderOpen");
            TimeWiatOpenPoz = info.GetInt32("TimeWiatOpenPoz");
            SpredForKillOrderOpen = info.GetDouble("SpredForKillOrderOpen");
        }

        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("Profit", Profit);
            info.AddValue("StopLimitOtstup", StopLimitOtstup);
            info.AddValue("TypePricing", TypePricing);
            info.AddValue("StopLimitSpred", StopLimitSpred);
            info.AddValue("TypeStop", TypeStop);

            info.AddValue("TypeOrderOpen", TypeOrderOpen);
            info.AddValue("OtstupForOpenOrder", OtstupForOpenOrder);
            info.AddValue("KillOrderOpen", KillOrderOpen);
            info.AddValue("TimeWiatOpenPoz", TimeWiatOpenPoz);
            info.AddValue("SpredForKillOrderOpen", SpredForKillOrderOpen);
        }
    }
}
